package Run;

import Rete.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;


public class GestorePartita {
    Server partita;
    Client giocatore;
    int portaDelServer = 1234; //////////////////////// <<----------------------- PORTA DEL SERVER
    DatagramSocket socketGUI;

    public GestorePartita() 
    {
        System.out.println("creo il gestore della partita");
        partita = null;
         creaClient();
         creaSocketGUI();
    }

    public void creaPartita()   //SERVER
    {
        if (partita == null) //se la partita non esiste la creo
        {
            System.out.println("creo la partita");
            partita = new Server(portaDelServer);
            partita.start(); //avvio il thread del server in ascolto delle richieste (da parte dei client)
        }
        else //se esisteva gia' una partita azzero i campi
        {
            partita.inizializza();
        }
    }

    private void creaClient()    //CLIENT
    {
        if (giocatore == null) //se il giocatore non esiste lo creo
        {
            System.out.println("creo il giocatore");
            giocatore = new Client(portaDelServer);
            giocatore.start(); //avvio il thread del client in ascolto delle richieste (da parte della GUI e del server)
        }
        else //se esisteva gia' un giocatore azzero i campi
        {
            giocatore.inizializza();
        }
    }

    public Server getPartita()
    {
        return partita;
    }

    public Client getGiocatore()
    {
        return giocatore;
    }
        ///////////////////////// METODI INVOCATI DALLA GUI //////////////////////////
    private void creaSocketGUI()
    {
        try
        {
            socketGUI = new DatagramSocket();
        } catch (SocketException ex) {Logger.getLogger(GestorePartita.class.getName()).log(Level.SEVERE, null, ex);}
    }

    public void iniziaPartita()
    {
        int portaDelClient = giocatore.getSocket().getLocalPort();
        System.out.println("--- DA GUI A CLIENT ---");
        Utils.inviaStringaSuSocket("GUI: iniziaPartita", socketGUI, "127.0.0.1", portaDelClient);
    }

    public void cancellaDalServer()
    {
        int portaDelClient = giocatore.getSocket().getLocalPort();
        System.out.println("--- DA GUI A CLIENT ---");
        Utils.inviaStringaSuSocket("GUI: cancellaDalServer", socketGUI, "127.0.0.1", portaDelClient);
    }

    public void annullaPartita()
    {
        int portaDelClient = giocatore.getSocket().getLocalPort();
        System.out.println("--- DA GUI A CLIENT ---");
        Utils.inviaStringaSuSocket("GUI: annullaPartita", socketGUI, "127.0.0.1", portaDelClient);
    }

    public void uniscitiAllaPartita()
    {
        int portaDelClient = giocatore.getSocket().getLocalPort();
        System.out.println("--- DA GUI A CLIENT ---");
        Utils.inviaStringaSuSocket("GUI: uniscitiAllaPartitaSulServer", socketGUI, "127.0.0.1", portaDelClient);
    }

    public void aggiornaGiocatori()
    {
        int portaDelClient = giocatore.getSocket().getLocalPort();

        System.out.println("--- DA GUI A CLIENT ---");
        Utils.inviaStringaSuSocket("GUI: aggiornaGiocatori", socketGUI, "127.0.0.1", portaDelClient);
    }
}
